package org.grayrabbit.cms.service.category.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.grayrabbit.cms.entity.Category;


/**
 *		CategoryCache.java
 *		@Author      hasau   
 *		@CreateTime  2011-10-21  上午8:45:30	
 **/
public class CategoryCache {

	/**站点map(全部栏目)*/
	private static Map<String, List<Category>> SITE_MAP  =  new HashMap<String, List<Category>>();
	
	/** 站点 更新标志  每个站点id 对应该站点下栏目的更新状态*/
	private static Map<String, Boolean> KEY_FLAG_MAP = new HashMap<String, Boolean>();
	
	
	/**当前管理员当前站点map(有权限) 用于 栏目管理    key：adminId_siteId*/
	private static Map<String, List<Category> > AUTH_CAT_CAT  =  new HashMap<String, List<Category> >();
	
	/**当前管理员当前站点map(无权限) 用于 栏目管理    key：adminId_siteId*/
	private static Map<String, List<Category> > AUTH_NO_CAT_CAT  =  new HashMap<String, List<Category> >();
	
	/**当前管理员当前站点map(有权限) 用于内容管理    key：adminId_siteId*/
	private static Map<String, List<Category> > AUTH_CAT_CONTENT  =  new HashMap<String, List<Category> >();
	
	/**当前管理员当前站点map(无权限) 用于内容管理    key：adminId_siteId*/
	private static Map<String, List<Category> > AUTH_NO_CAT_CONTENT  =  new HashMap<String, List<Category> >();
	
	/**当前管理员当前权限栏目map(权限栏目:栏目)  String：admnId_siteid,Boolean:true最新直接调用，false重新加载 */
	private static Map<String, Boolean> ADMIN_SITE_KEY_FLAG = new HashMap<String, Boolean>();

	/**
	 * @param siteId  站点Id
	 * @param cats  站点下的所有栏目集合
	 */
	public static void  addSiteCategoriesMap(String siteId ,List<Category> cats){
		SITE_MAP.put(siteId, cats);
	}
	
	/**
	 *  站点修改标志信息 载入
	 * @param siteId
	 * @param flag  有变动 false 要重新加载 ,true 最新
	 */
	public static void addSiteCategoriesFlag(String siteId,Boolean flag){
		KEY_FLAG_MAP.put(siteId, flag);
	}

	/**
	 * 获取站点信息
	 * @param siteId
	 * @return
	 */
	public static List<Category> getSiteCategories(String siteId){
		List<Category> set =null;
		if(StringUtils.isNotBlank(siteId) && SITE_MAP.keySet().contains(siteId)){ 
			set = SITE_MAP.get(siteId);
		}		
		return set;
	} 
	
	/**
	 * 获取站点修改标志信息 有变动 false 要重新加载 ,true 最新
	 * @param siteId
	 * @return
	 */
	public static boolean getSiteCategoriesFlag(String siteId){
		boolean flag =false;
		if(StringUtils.isNotBlank(siteId) && SITE_MAP.keySet().contains(siteId)){ 
			flag = (boolean) KEY_FLAG_MAP.get(siteId);
		}		
		return flag;
	} 
	
	/**
	 * 移除站点修改标志  移除站点信息
	 * @param siteId
	 */
	public static void removeSiteCategoriesAndFlagInfo(String siteId){	 			
		removeSiteCategoriesFlag(siteId);
		removeSiteCategories(siteId);		
	}
	
	/**
	 * 移除站点信息
	 * @param siteId
	 */
	public static void removeSiteCategories(String siteId){
		if(StringUtils.isNotBlank(siteId) && SITE_MAP.keySet().contains(siteId)){ 
				SITE_MAP.remove(siteId); 
		}
	}
	
	/**移除站点FLAG
	 * @param siteId
	 */
	public static void removeSiteCategoriesFlag(String siteId){
		if(StringUtils.isNotBlank(siteId) && KEY_FLAG_MAP.keySet().contains(siteId)){
				KEY_FLAG_MAP.remove(siteId);
		}
	}
	/**添加当前用户当前站点 （栏目管理 有权限） 树数据*/
	public static void addAuthCategories_cat(String adminId_siteId ,List<Category>  set){
		AUTH_CAT_CAT.put(adminId_siteId, set);
	}
	/**添加当前用户当前站点 （栏目管理 无权限） 树数据*/
	public static void addAuthNoCats_cat(String adminId_siteId ,List<Category>  set){
		AUTH_NO_CAT_CAT.put(adminId_siteId, set);
	}
	
	/**添加当前用户当前站点 （内容管理 有权限） 树数据*/
	public static void addAuthCategories_content(String adminId_siteId ,List<Category>  set){
		AUTH_CAT_CONTENT.put(adminId_siteId, set);
	} 
	
	
	/**添加当前用户当前站点 （内容管理 无权限） 树数据*/
	public static void addAuthNoCats_content(String adminId_siteId ,List<Category>  set){
		AUTH_NO_CAT_CONTENT.put(adminId_siteId, set);
	}
	
	/**添加当前用户当前站点 树数据标志*/
	public static void addAuthCategoriesFlag(String adminId_siteId ,Boolean flag){
		ADMIN_SITE_KEY_FLAG.put(adminId_siteId, flag);
	}
	
	/**获取当前用户当前站点 （栏目管理 有权限） 树数据*/
	public static List<Category>  getAuthCategories_cat(String adminId_siteId){
		return AUTH_CAT_CAT.get(adminId_siteId);
	}
	/**获取当前用户当前站点 （栏目管理 无权限） 树数据*/
	public static List<Category>  getAuthNoCats_cat(String adminId_siteId){
		return AUTH_NO_CAT_CAT.get(adminId_siteId);
	}
	
	/**获取当前用户当前站点 （内容管理 有权限） 树数据*/
	public static List<Category>  getAuthCategories_content(String adminId_siteId ){
		return AUTH_CAT_CONTENT.get(adminId_siteId);
	} 
	
	
	/**获取当前用户当前站点 （内容管理 无权限） 树数据*/
	public static List<Category>  getAuthNoCats_content(String adminId_siteId ){
		return AUTH_NO_CAT_CONTENT.get(adminId_siteId);
	}
	
	/**获取当前用户当前站点 树数据标志*/
	public static boolean getAuthCategoriesFlag(String adminId_siteId){
		try {			
			return (boolean)ADMIN_SITE_KEY_FLAG.get(adminId_siteId);
		} catch (Exception e) {
			return false; 
		}
	}
	
	/**通过管理员IDs 删除*/
	public static void  removeAuthCatsAndFlagbyAdminIds(String adminIds){
		if(StringUtils.isBlank(adminIds)) return ;
		String[] ids = adminIds.split(",");
		Set<String> set = new HashSet<String>();
		set.addAll(ADMIN_SITE_KEY_FLAG.keySet());
		for(String adminId : ids){
			adminId +="_";
			for(String s:set){
				if(s.startsWith(adminId)){
					ADMIN_SITE_KEY_FLAG.remove(s);
					AUTH_CAT_CAT.remove(s);
					AUTH_NO_CAT_CAT.remove(s);
					AUTH_CAT_CONTENT.remove(s);
					AUTH_NO_CAT_CONTENT.remove(s);
				}
			}
		}
		
		//test  要删除
//		KEY_FLAG_MAP.clear();
//		SITE_MAP.clear();
//		ADMIN_SITE_KEY_FLAG.clear();
//		AUTH_CAT_CAT.clear();
//		AUTH_CAT_CONTENT.clear();
//		AUTH_NO_CAT_CAT.clear();
//		AUTH_NO_CAT_CONTENT.clear();
		
	}
	
	/**通过站点IDs 删除*/
	public static void  removeAuthCatsAndFlagbySiteIds(String siteIds){
		if(StringUtils.isBlank(siteIds)) return ;
		String[] ids = siteIds.split(",");
		Set<String> set = new HashSet<String>();
		set.addAll(ADMIN_SITE_KEY_FLAG.keySet());
		for(String siteId : ids){
			siteId ="_"+siteId;
			for(String s:set){
				if(s.endsWith(siteId)){
					ADMIN_SITE_KEY_FLAG.remove(s);
					AUTH_CAT_CAT.remove(s);
					AUTH_NO_CAT_CAT.remove(s);
					AUTH_CAT_CONTENT.remove(s);
					AUTH_NO_CAT_CONTENT.remove(s);
				}
			}
		}
	}
	
	
}
